package leetcode.array;

import java.util.Arrays;

/**
 * @author Cheng Jun
 * Description: n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。
 * <p>
 * 你需要按照以下要求，给这些孩子分发糖果：
 * <p>
 * 每个孩子至少分配到 1 个糖果。
 * 相邻两个孩子评分更高的孩子会获得更多的糖果。
 * 请你给每个孩子分发糖果，计算并返回需要准备的 最少糖果数目 。
 * 1 <= n <= 2 * 10^4
 * <p>
 * 链接：https://leetcode.cn/problems/candy
 * @version 1.0
 * @date 2022/8/3 13:11
 * 困难题 字节面试题
 */
public class candy {

    public static void main(String[] args) {
        // 分别给第一个、第二个、第三个孩子发 1、2、1 颗糖果。
        System.out.println(candy(new int[]{1, 2, 2}));
    }

    /**
     * 思路：第 i 个孩子分到的糖果个数，和第 i-1个孩子、第 i+1 个孩子相关。
     * 左规则：第 i 个孩子的得分比 第 i-1 个孩子高，那么 第i个孩子的糖果比 第i-1个孩子的糖果多一个
     * 右规则：第 i 个孩子的得分比 第 i+1 个孩子高，呢么 第i个孩子的糖果比 第i+1个孩子的糖果多一个
     * @param ratings
     * @return int
     * @author Cheng Jun
     * @date 2022/8/3 13:13
     */
    static int candy(int[] ratings) {
        int res = 0;
        int[] leftCandy = new int[ratings.length];
        int[] rightCandy = new int[ratings.length];
        Arrays.fill(leftCandy, 1);
        Arrays.fill(rightCandy, 1);
        // 左规则：第 i 个孩子的得分比 第 i-1 个孩子高，那么 第i个孩子的糖果比 第i-1个孩子的糖果多一个
        for (int i = 1; i < ratings.length; i++) {
            if (ratings[i - 1] < ratings[i]) {
                leftCandy[i] = leftCandy[i - 1] + 1;
            }
        }
        // 右规则：第 i 个孩子的得分比 第 i+1 个孩子高，呢么 第i个孩子的糖果比 第i+1个孩子的糖果多一个
        for (int i = ratings.length - 2; 0 <= i; i--) {
            if (ratings[i] > ratings[i + 1]) {
                rightCandy[i] = rightCandy[i + 1] + 1;
            }
        }
        // 同时满足左、右规则
        for (int i = 0; i < ratings.length; i++) {
            res += Math.max(leftCandy[i], rightCandy[i]);
        }
        return res;
    }

    // 常数空间遍历：https://leetcode.cn/problems/candy/solution/fen-fa-tang-guo-by-leetcode-solution-f01p/
    // 待学习
}
